package com.woniu.comment.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.HashMap;


@Configuration
@Component
public class RabbitMQConfig {
    @Bean
    public Queue loginPhoneQueue() {
        //实例化一个队列
        /**
         * 构造方法最多可以传入5个参数
         * 参数1:队列名称 自定义
         * 参数2:队列是否持久化
         * 参数3:是否被当前连接使用,默认false
         * 参数4:如果没有使用该队列,是否自动删除默认false
         * 参数5:传入键值对定义其他参数
         */
        Queue queue = new Queue("login_phone_queue");
        return queue;
    }

    //创建多个队列
    @Bean
    public Queue registerPhoneQueue1() {
        //实例化一个队列
        /**
         * 构造方法最多可以传入5个参数
         * 参数1:队列名称 自定义
         * 参数2:队列是否持久化
         * 参数3:是否被当前连接使用,默认false
         * 参数4:如果没有使用该队列,是否自动删除默认false
         * 参数5:传入键值对定义其他参数
         */
        Queue queue = new Queue("register_phone_queue");
        return queue;
    }
    @Bean
    public Queue registerPhoneQueue2() {
        //实例化一个队列
        /**
         * 构造方法最多可以传入5个参数
         * 参数1:队列名称 自定义
         * 参数2:队列是否持久化
         * 参数3:是否被当前连接使用,默认false
         * 参数4:如果没有使用该队列,是否自动删除默认false
         * 参数5:传入键值对定义其他参数
         */
        Queue queue = new Queue("register_phone_queue");
        return queue;
    }
    //创建一个交换机
    @Bean
    public FanoutExchange registerExchange() {
        /**
         * 创建发布订阅模式下的交换机
         */
        return new FanoutExchange("register_phone_exchange");
    }
    @Bean
    public FanoutExchange loginExchange() {
        /**
         * 创建发布订阅模式下的交换机
         */
        return new FanoutExchange("login_phone_exchange");
    }
    @Bean
    public Binding bindingExchangeC(){
        return BindingBuilder.bind(loginPhoneQueue()).to(loginExchange());
    }
    //将队列1绑定到交换机上
    @Bean
    public Binding bindingExchangeA(){
        return BindingBuilder.bind(registerPhoneQueue1()).to(registerExchange());
    }
    //将队列2绑定到交换机上
    @Bean
    public Binding bindingExchangeB(){
        return BindingBuilder.bind(registerPhoneQueue2()).to(registerExchange());
    }



    //下面这一组用于订单延迟更新操作
    //1.创建一个死信队列
    @Bean
    public Queue orderNumDelayQueue() {
        HashMap<String, Object> map = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        map.put("x-message-ttl",60*1000);
        //x-dead-letter-exchange 属性用于声明死信转发到的交换机
        map.put("x-dead-letter-exchange","order_delay_exchange");
        //x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称
        map.put("x-dead-letter-routing-key","pay");
        return new Queue("order_dead_queue",true,false,false,map);
    }

    //2.创建一个交换机
    @Bean
    public DirectExchange orderNumDelayExchange() {
        /**
         * 创建发布订阅模式下的交换机
         */
        return new DirectExchange("order_delay_exchange");
    }

    //3.创建一个用于接收由交换机发来的延迟通知
    @Bean
    public Queue orderNumQueue() {
        Queue queue = new Queue("order_num_queue");
        return queue;
    }
    @Bean
    public Binding bindingOrderNumQueue(){
        return BindingBuilder.bind(orderNumQueue()).to(orderNumDelayExchange()).with("pay");
    }
}